نکته ای عجیب درباره Statistics و Recompile در SQL Server

نکته ای عجیب درباره Statistics و Recompile در SQL Server


به طور معمول، وقتی SQL Server آمار (Statistics) یک جدول را به روزرسانی می کند، پلن های اجرایی کش شده ای که به آن آمار وابسته اند باطل می شوند و در اجرای بعدی، پلن جدید ساخته می شود. این رفتار کاملاً منطقی است، چون داده ها تغییر کرده اند و SQL Server باید تصمیم گیری جدیدی انجام دهد. اما…
یک استثنای عجیب و کمتر شناخته شده وجود دارد:
اگر آمار به صورت خودکار توسط SQL Server ساخته شده باشد (یعنی همان _WA_Sys ها)، حتی اگر این آمار بعداً با FULLSCAN به روزرسانی شود:

  • پلن قبلی invalidate نمی شود
  • کوئری دوباره کامپایل نمی شود
  • SQL Server همچنان از تخمین های قدیمی استفاده می کند

اما دلیلش چیست؟

 این آمار سیستمی (Auto-created) است و SQL Server برای این نوع آمارها recompile خودکار انجام نمی دهد.

تنها راه:

  • اجرای دستور EXEC sp_recompile TableName
  • پاک شدن Plan Cache.

آیا این موضوع در عمل خطرناک است؟
تقریباً نه. چون:

  • معمولاً آمار مهم روی ایندکس ها هستند، نه آمار سیستمی
  • Plan Cache در سیستم های واقعی مدام در حال تغییر است
  • Recompile زیاد هم خودش مشکل زاست

پس SQL Server عمداً در اینجا محافظه کارانه عمل می کند.

سید حامد واحدی سید حامد واحدی     8 بهمن 1404